package com.sky.orangehireserver.modules.enterprise.controller;

import com.sky.orangehireserver.aspect.ApiOperationLog;
import com.sky.orangehireserver.modules.enterprise.dto.EnterpriseInfoUpdateDTO;
import com.sky.orangehireserver.modules.enterprise.service.EnterpriseInfoService;
import com.sky.orangehireserver.modules.enterprise.vo.EnterpriseInfoVO;
import com.sky.orangehireserver.utils.Response;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

/**
 * 企业信息管理控制器
 * 
 * @author sky
 */
@Slf4j
@RestController
@RequestMapping("/enterprise/info")
@RequiredArgsConstructor
@Tag(name = "企业信息管理", description = "企业管理员管理企业信息相关接口")
public class EnterpriseInfoController {

    private final EnterpriseInfoService enterpriseInfoService;

    /**
     * 获取当前企业信息
     * 
     * @param orgId 企业ID（从请求头或上下文中获取）
     * @return 企业信息VO
     */
    @GetMapping
    @Operation(summary = "获取当前企业信息", description = "企业管理员获取自己企业的详细信息")
    @ApiOperationLog(description = "获取当前企业信息")
    public Response<EnterpriseInfoVO> getCurrentEnterpriseInfo(
            @Parameter(description = "企业ID", hidden = true) @RequestHeader(value = "X-Org-Id", required = false) Long orgId) {
        
        // TODO: 在实际项目中，企业ID应该从JWT token或用户上下文中获取
        // 这里暂时从请求头获取，实际应该通过认证拦截器或AOP获取当前登录用户的企业ID
        if (orgId == null) {
            // 临时处理：如果请求头没有企业ID，可以从路径参数获取
            throw new RuntimeException("企业ID不能为空，请在请求头中添加X-Org-Id");
        }
        
        EnterpriseInfoVO enterpriseInfo = enterpriseInfoService.getCurrentEnterpriseInfo(orgId);
        return Response.success(enterpriseInfo);
    }

    /**
     * 获取指定企业信息（带路径参数版本）
     * 
     * @param orgId 企业ID
     * @return 企业信息VO
     */
    @GetMapping("/{orgId}")
    @Operation(summary = "获取指定企业信息", description = "根据企业ID获取企业信息")
    @ApiOperationLog(description = "获取指定企业信息")
    public Response<EnterpriseInfoVO> getEnterpriseInfo(
            @Parameter(description = "企业ID") @PathVariable Long orgId) {
        
        EnterpriseInfoVO enterpriseInfo = enterpriseInfoService.getCurrentEnterpriseInfo(orgId);
        return Response.success(enterpriseInfo);
    }

    /**
     * 更新当前企业信息
     * 
     * @param orgId 企业ID（从请求头或上下文中获取）
     * @param updateDTO 企业信息更新请求DTO
     * @return 更新后的企业信息VO
     */
    @PutMapping
    @Operation(summary = "更新当前企业信息", description = "企业管理员更新自己企业的信息")
    @ApiOperationLog(description = "更新当前企业信息")
    public Response<EnterpriseInfoVO> updateCurrentEnterpriseInfo(
            @Parameter(description = "企业ID", hidden = true) @RequestHeader(value = "X-Org-Id", required = false) Long orgId,
            @Valid @RequestBody EnterpriseInfoUpdateDTO updateDTO) {
        
        // TODO: 在实际项目中，企业ID应该从JWT token或用户上下文中获取
        if (orgId == null) {
            throw new RuntimeException("企业ID不能为空，请在请求头中添加X-Org-Id");
        }
        
        EnterpriseInfoVO enterpriseInfo = enterpriseInfoService.updateEnterpriseInfo(orgId, updateDTO);
        return Response.success(enterpriseInfo);
    }

    /**
     * 更新指定企业信息（带路径参数版本）
     * 
     * @param orgId 企业ID
     * @param updateDTO 企业信息更新请求DTO
     * @return 更新后的企业信息VO
     */
    @PutMapping("/{orgId}")
    @Operation(summary = "更新指定企业信息", description = "根据企业ID更新企业信息")
    @ApiOperationLog(description = "更新指定企业信息")
    public Response<EnterpriseInfoVO> updateEnterpriseInfo(
            @Parameter(description = "企业ID") @PathVariable Long orgId,
            @Valid @RequestBody EnterpriseInfoUpdateDTO updateDTO) {
        
        EnterpriseInfoVO enterpriseInfo = enterpriseInfoService.updateEnterpriseInfo(orgId, updateDTO);
        return Response.success(enterpriseInfo);
    }

    /**
     * 检查企业状态
     * 
     * @param orgId 企业ID
     * @return 企业状态检查结果
     */
    @GetMapping("/{orgId}/status")
    @Operation(summary = "检查企业状态", description = "检查企业是否存在且状态正常")
    @ApiOperationLog(description = "检查企业状态")
    public Response<Boolean> checkEnterpriseStatus(
            @Parameter(description = "企业ID") @PathVariable Long orgId) {
        
        boolean isValid = enterpriseInfoService.isEnterpriseValid(orgId);
        return Response.success(isValid);
    }
}
